﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Utilities;

namespace Comissoes.Models
{
    public class CondicoesPagamentoModel
    {
        public CONDICOES_PAGAMENTO condicao { get; set; }
        private DIAS_CONDICAO_PAGAMENTO dia { get; set; }
        public SelectList TIPO_CDPG { get; private set; }

        xcontEntities db = new xcontEntities();
        List<string> erros;

        /// <summary>
        /// Construtor Padrão
        /// </summary>
        /// <param name="COD_CDPG"></param>
        public CondicoesPagamentoModel(Int32? COD_CDPG)
        {
            if (COD_CDPG.HasValue)
            {
                this.condicao = db.CONDICOES_PAGAMENTO.FirstOrDefault(t => t.COD_CDPG == COD_CDPG);
            }
            else
            {
                this.condicao = new CONDICOES_PAGAMENTO();
            }

            this.CreateSelectLists();
        }

        private void CreateSelectLists()
        {
            List<SelectListItem> tipos = new List<SelectListItem>
            {
                new SelectListItem{ Text = "Comercial", Value = "A", Selected = this.condicao.TIPO_CDPG == "A" },
                new SelectListItem{ Text = "Crediário", Value = "B", Selected = this.condicao.TIPO_CDPG == "B" }
            };

            this.TIPO_CDPG = new SelectList(tipos, "Value", "Text");
        }

        /// <summary>
        /// Validar alteração da condiçãode pagamento
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        private List<string> UpdateValidate(FormCollection form)
        {
            this.erros = new List<string>();
            String DESC_CDPG = form["DESC_CDPG"];

            if (String.IsNullOrEmpty(DESC_CDPG))
                erros.Add("É necessário informar a descrição da condicao de pagamento.");

            if (String.IsNullOrEmpty(form["TIPO_CDPG"]))
                erros.Add("É necessário informar o tipo da condicao de pagamento.");

            else if (db.CONDICOES_PAGAMENTO.Any(t => t.DESC_CDPG == DESC_CDPG && t.COD_CDPG != this.condicao.COD_CDPG))
                erros.Add("Já existe uma condicao de pagamento cadastrada com esta descrição no momento.");
            
            return erros;
        }

        /// <summary>
        /// Alterar a codição de pagamento
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        public List<string> Update(FormCollection form)
        {
            this.erros = new List<string>();

            try
            {
                if (db.CONDICOES_PAGAMENTO.Any(t => t.COD_CDPG == this.condicao.COD_CDPG))
                    this.condicao = db.CONDICOES_PAGAMENTO.FirstOrDefault(t => t.COD_CDPG == this.condicao.COD_CDPG);

                else
                    db.AddToCONDICOES_PAGAMENTO(this.condicao);

                this.condicao.COEF_CDPG = Convertions.Decimal(form["COEF_CDPG"]);
                this.condicao.DESC_CDPG = form["DESC_CDPG"];
                this.condicao.DIA_CDPG = Convertions.Inteiro(form["DIA_CDPG"]);
                this.condicao.PARCELAS_CDPG = Convertions.Inteiro(form["PARCELAS_CDPG"]);
                this.condicao.TAC_CDPG = Convertions.Decimal(form["TAC_CDPG"]);
                this.condicao.TAXA_CDPG = Convertions.Decimal(form["TAXA_CDPG"]);
                this.condicao.TIPO_CDPG = form["TIPO_CDPG"];

                db.SaveChanges();
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return erros;
        }

        /// <summary>
        /// Excluir a condição de pagamento
        /// </summary>
        /// <returns></returns>
        public List<string> Delete()
        {
            this.erros = new List<string>();

            if (db.DIAS_CONDICAO_PAGAMENTO.Any(t => t.CONDICOES_PAGAMENTO.COD_CDPG == this.condicao.COD_CDPG))
            {
                erros.Add("Existem dias cadastrados nesta condição de pagamento no momento.");
            }

            if (db.VENDAS.Any(t => t.CONDICOES_PAGAMENTO.COD_CDPG == this.condicao.COD_CDPG))
            {
                erros.Add("Existem vendas/notas fiscais realizadas com esta condição de pagamento no momento.");
            }

            if (!erros.Any())
            {
                try
                {
                    db.DeleteObject(db.CONDICOES_PAGAMENTO.FirstOrDefault(t => t.COD_CDPG == this.condicao.COD_CDPG));
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }

            return erros;
        }

        /// <summary>
        /// Validar a alteração do dia da condição de pagamento
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        private List<string> DiaCondicaoUpdateValidate(FormCollection form)
        {
            this.erros = new List<string>();
            Int32? DIA_DICP = Convertions.Inteiro(form["DIA_DICD"]);

            if (!DIA_DICP.HasValue)
            {
                erros.Add("É necessário informar o dia de vencimento.");
            }

            else if (DIA_DICP <= 0)
            {
                erros.Add("Dia inválido.");
            }

            else if (db.DIAS_CONDICAO_PAGAMENTO.Any(t => t.DIA_DICP == DIA_DICP && t.CONDICOES_PAGAMENTO.COD_CDPG != this.condicao.COD_CDPG))
            {
                erros.Add("Este dia já encontra-se cadastrado para esta condição de pagamento no momento.");
            }

            return erros;
        }

        /// <summary>
        /// Alterar o dia da codição de pagamento
        /// </summary>
        /// <param name="DIA_DICP"></param>
        /// <param name="ID_DICP"></param>
        /// <param name="COD_CDPG"></param>
        /// <returns></returns>
        public List<string> DiaCondicaoUpdate(FormCollection form)
        {
            this.erros = new List<string>();

            try
            {
                Int32? DIA_DICP = Convertions.Inteiro(form["DIA_DICP"]);
                Int32? ID_DICP = Convertions.Inteiro(form["ID_DICP"]);
                Int32? COD_CDPG = Convertions.Inteiro(form["COD_CDPG"]);

                if (db.DIAS_CONDICAO_PAGAMENTO.Any(t => t.ID_DICP == ID_DICP))
                {
                    this.dia = db.DIAS_CONDICAO_PAGAMENTO.FirstOrDefault(t => t.ID_DICP == ID_DICP);
                }

                else
                {
                    db.AddToDIAS_CONDICAO_PAGAMENTO(this.dia);
                }

                this.dia.DIA_DICP = DIA_DICP;
                this.dia.CONDICOES_PAGAMENTO = this.condicao;

                db.SaveChanges();
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return erros;
        }

        /// <summary>
        /// Excluir o dia da condição de pagamento
        /// </summary>
        /// <param name="ID_DICP"></param>
        /// <returns></returns>
        public List<string> DiaCondicaoDelete(Int32? ID_DICP)
        {
            this.erros = new List<string>();

            if (!erros.Any())
            {
                try
                {
                    db.DeleteObject(db.DIAS_CONDICAO_PAGAMENTO.FirstOrDefault(t => t.ID_DICP == ID_DICP));
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }

            return erros;
        }
    }
}
